Computers have been used for many years to perform complex and repetitive calculations for scientists and other computationally intensive users. The most complex calculations and operations have typically been performed on what are commonly referred to as “supercomputers.” As computer technology has improved, the capabilities of supercomputers have, correspondingly, also improved. “Petascale” computers are currently considered to be the state of the art supercomputers. A petascale computer is generally considered to be a computer or computer system capable of performing a quadrillion (1015) arithmetic operations per second.
Programming a typical supercomputer often requires a user to have intimate knowledge of the core architecture of the computer. Scientists and other computationally intensive end users often must become experts, or work with someone who is an expert, in the use, architecture, and low level programming of a supercomputer in order to use the supercomputer to perform the calculations desired by the end user. Without being a domain expert in supercomputing, or having access to a domain expert in supercomputing available for assistance, the end user will likely find it difficult to achieve maximum performance. Thus, an end user will need to expend time, knowledge, and/or other resources to effectively program the supercomputer, which may be significantly above and beyond the “core” competency of the subject matter of the scientific or other problem being evaluated by the supercomputer.
Further, some supercomputers are created and designed for use in solving a specific problem such that there is only one, or a very limited number of such supercomputers in the world. Thus, the availability of expertise in the use of the problem specific supercomputer is very limited, which may require that the end user become an expert in the in the use, architecture, and low level programming of the problem specific supercomputer as there may not be any available domain experts in the use, architecture, and low level programming of the problem specific supercomputer.
Field Programmable Gate Arrays (FPGAs) started out as prototyping devices, allowing for convenient development of glue-logic-type applications for connecting microchips without high design costs or large numbers of discrete standard logic gates. As the gate density of FPGA devices increased and application specific blocks were added, the applications shifted from glue logic to a wide variety of solutions for signal processing and network problems. Because FPGA devices are controlled by the state of the SRAM bits (Static Random Access Memory bits), the functionality may be changed by modifying the memory state, which can be useful since logic may be customized for a particular application.
FPGAs work by having hundreds of thousands of lookup tables and small routing elements that may be connected together to build larger functions, and fed into registers and memory elements to build applications. An FPGA may implement a wide variety of digital hardware designs. Microprocessors, network switches, software defined radios, and image processing are among the many applications that may be implemented with an FPGA. Typically, applications are designed using Computer-Aided Design (CAD) tools that translate high level HDL (Hardware Design Language) descriptions of the low level computational blocks and data movements into the programming for the routing elements and look up tables of the FPGA. HDL requires data movement and computation to be specified at a cycle-by-cycle level so that the designer is responsible for every bit at every moment in time. HDL is not generally considered to be user friendly. Therefore, traditional FPGA development is expensive and time consuming since an FPGA expert is required and, even with the FPGA expert, the tools may still be difficult to use. Thus, the acceptance of FPGA hardware in high performance computing has been slow. Making use of the full capabilities of the FPGA hardware requires highly skilled FPGA designers with years of experience, which are rarely the typical end users of a supercomputer system.